package com.example.mvp.view;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.example.baselibrary.R;
import com.example.mvp.adapter.holder.BaseViewHolder;
import com.example.mvp.binder.BaseDataBinder;
import com.example.mvp.delegate.XDelegate;

import java.util.ArrayList;
import java.util.List;

/**
 * RecyclerView适配器
 *
 * @author chaohaipeng  on 2018/8/6.
 */

public abstract class BaseRecyclerViewAdapter<T extends XDelegate, D extends Object> extends RecyclerView.Adapter< RecyclerView.ViewHolder> implements View.OnClickListener {
    private Context mContext;
    private List<D> data;
    //用一个集合将适配中创建的所有 holder对象存储到这个容器中，因为本类中有对holder中的控件创建了监听事件
    //如果不取消监听，可能会出现内存泄漏的问题，所以将holder保存，创建一个方法将绑定监听事件的控件的监听事件至空(个人观点)
    private List<BaseViewHolder> mListHolder;
    private  T viewBindDelegate = null;
    //这两个静态变量来区分是normalView还是footView。
    public static final int NORMAL_VIEW = 0;
    public static final int FOOT_VIEW = 1;
    //重写一下getItemViewType,返回两个我们自己定义的参数，美滋滋~
    private ProgressBar pull_to_refresh_progress;
    private TextView tv_refresh_title;
    private View footView;

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    public BaseRecyclerViewAdapter(Context context, List<D> data) {
        mListHolder = new ArrayList<>();
        this.mContext = context;
        if (null != data) {
            this.data = data;
        } else {
            this.data = new ArrayList<>();
        }
    }



    @Override
    public int getItemCount() {
        if (null == data) {
            return 0;
        }
        return data.size()+1;
    }


    public Object getItems(int position) {
        if (null == data) {
            return null;
        }
        return data.get(position);
    }

    private View initFootView() {
        footView = LayoutInflater.from(mContext).inflate(R.layout.layout_listview_end, null);
        pull_to_refresh_progress = footView.findViewById(R.id.pull_to_refresh_progress);
        tv_refresh_title = footView.findViewById(R.id.tv_refresh_title);
        return footView;
    }

      public void VisibleFootView(){
        if (pull_to_refresh_progress!=null&&tv_refresh_title!=null){
            pull_to_refresh_progress.setVisibility(View.VISIBLE);
            tv_refresh_title.setVisibility(View.VISIBLE);
        }

      }
    public void InVisibleFootView(){
        if (pull_to_refresh_progress!=null&&tv_refresh_title!=null){
            pull_to_refresh_progress.setVisibility(View.GONE);
            tv_refresh_title.setVisibility(View.GONE);
        }
    }




    @Override
    public  RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == getItemCount()-1) {
          View rootView=  LayoutInflater.from(mContext).inflate(R.layout.layout_listview_end, null);
            //如果是footView那么给footView赋值。
            FootViewHolder footViewHolder = new FootViewHolder(rootView);
            return footViewHolder;
        } else {
            //如果是normalView那么给textView(就是item的内容)赋值。
            T viewDelegate = null;
            if (viewDelegate == null) {
                viewDelegate = initDelegate(mContext);
            }
            viewBindDelegate=viewDelegate;
            View convertView = viewDelegate.getRootView();
            convertView.setOnClickListener(this);
            BaseViewHolder baseViewHolder = new BaseViewHolder(convertView, viewType);
            mListHolder.add(baseViewHolder);
            return baseViewHolder;
        }
    }

    public void onBindViewHolders( RecyclerView.ViewHolder holder, int position) {
            int itemViewType = getItemViewType(position);
            if (itemViewType == getItemCount()-1) {
            }else{

                try {
                    if (getDataBinder() != null) {
                        getDataBinder().viewBindModel(viewBindDelegate, data.get(position));
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                notifyView(viewBindDelegate, position);
                bindEvenListener(viewBindDelegate, position);
                holder.itemView.setTag(position + "");
            }
    }
    private class FootViewHolder extends RecyclerView.ViewHolder {

        FootViewHolder(View itemView) {
            super(itemView);
            pull_to_refresh_progress = itemView.findViewById(R.id.pull_to_refresh_progress);
            tv_refresh_title = itemView.findViewById(R.id.tv_refresh_title);
        }
    }


    /** 公共数据视图绑定控制器数据对象*/
    public abstract BaseDataBinder getDataBinder();
    /**
     * 注册界面控件点击事件
     */
    protected abstract void bindEvenListener(T viewDelegate, int position);

    /**
     * 自定义实现View刷新操作，通常用于单个的刷新或者未进行数据绑定时使用，如已经进行过数据绑定，则无需具体实现此方法
     */
    protected abstract void notifyView(T viewDelegate, int position);

    /**
     * 指定界面的视图控制器，必须指定
     */
    public abstract Class<T> getDelegateClass();

    public List<D> getData() {
        return data;
    }

    public void setData(List<D> data) {
        this.data = data;
    }

    public Context getContext() {
        return mContext;
    }

    /**
     * 初始化视图托管类对象
     */
    public T initDelegate(Context context) {
        T viewDelegate;
        try {
            viewDelegate = getDelegateClass().newInstance();
        } catch (InstantiationException e) {
            throw new RuntimeException("create IDelegate error");
        } catch (IllegalAccessException e) {
            throw new RuntimeException("create IDelegate error");
        }
        if (null != context) {
            viewDelegate.create(LayoutInflater.from(context), null);
        }
        return viewDelegate;
    }

    /**
     * 创建一个监听事件的接口；重要
     */
    public interface OnItemClickListener {
        void onClick(View v, int position);
    }

    private OnItemClickListener mOnItemClickListener = null;

    /**
     * 外界进行调用该方法，为item设置点击事件；重要
     *
     * @param listener
     */
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.mOnItemClickListener = listener;
    }


    /**
     * 这个是继承View.OnClickListener 实现的方法; 重要
     *
     * @param v 当前被点击的v;
     */
    @Override
    public void onClick(View v) {
        //判断当前是否为item设置监听事件
        if (mOnItemClickListener != null) {
            //如果设置了，那么回调该方法，由于view的tag是object类型的，希望能回调到当前所显示到第几项item所以进行类型转换，希望有更好的方法请赐教；
            mOnItemClickListener.onClick(v, Integer.parseInt((String) v.getTag()));
        }
    }

    //添加一个销毁的方法，这样可以加快回收，可以解决内存泄漏的问题，
    //可以用android studio 进行查看内存，多次开启和关闭程序，查看内存内存走势，
    //如果不填加次方法，那么内存会一直增加，并且点GC 内存也不会下降。
    //在activity的销毁方法中添加该方法，就解决了内存泄漏的方法。(这个方法不是最好的，但目前想到的解决方案只有这个，欢迎指点留言)
    public void onDestroy() {
        data.clear();
        data = null;
        for (int i = 0; i < mListHolder.size(); i++) {
            mListHolder.get(i).itemView.setOnClickListener(null);
        }
        mListHolder.clear();
        mListHolder = null;
    }



}
